iT邦幫忙

2024 iThome 鐵人賽

DAY 15
0
Python

從Python入門到自製遊戲:30天鐵人挑戰之旅系列 第 15

元類 (Metaclasses) 與類

  • 分享至 

  • xImage
  •  

今天上網學一些難一點點的內容。/images/emoticon/emoticon13.gif
元類(Metaclasses)是 Python 中一個進階且相對少見的特性。它們不僅可以用來創建類(Class),還能用來控制類的行為。通常,當我們定義類時,會使用 class 關鍵字來創建。然而,在 Python 中,類本身其實也是由某個類創建的,而這個類就稱為元類。Python 預設的元類是 type,當我們定義一個類時,它實際上是由 type 類別生成的對象。

使用元類可以讓我們在創建類時進行更深層次的控制,例如:自動化屬性檢查、修改類的定義、甚至在類創建時自動生成某些方法或屬性。要自定義元類,只需繼承 type 類,並重寫它的 newinit 方法。new 方法負責創建類,而 init 方法負責初始化類。我們可以利用這些方法來修改類的屬性、方法,或在類創建時執行一些自定義邏輯。

例如我們可以透過自定義元類來實現一個檢查機制,確保所有類的屬性名稱都是大寫,或自動為類添加某些方法。以下是一個簡單的範例:

class UpperAttrMeta(type):
    def __new__(cls, name, bases, dct):
        # 將所有屬性名稱轉換為大寫
        uppercase_attrs = {attr.upper(): value for attr, value in dct.items() if not attr.startswith('__')}
        return super().__new__(cls, name, bases, uppercase_attrs)

class MyClass(metaclass=UpperAttrMeta):
    foo = 'bar'

print(hasattr(MyClass, 'foo'))  # False
print(hasattr(MyClass, 'FOO'))  # True

在這段程式碼中,我們自定義了一個 UpperAttrMeta 元類,透過重寫 new 方法來將所有類屬性轉換為大寫。這樣做的好處是,我們可以輕鬆地為所有繼承該元類的類添加統一的屬性命名規則,避免手動重複操作。元類的概念與應用在一般開發中較少出現,但在需要進行大量類定義、自動化操作,或是需要創建類模板時,元類能提供非常強大的彈性與控制能力。因此理解元類不僅有助於深入理解 Python 的類機制,也為我們在進階應用中提供更多可能性。

今天的真的有點難,但在應用時蠻方便的,這有好有壞。能統一轉成大寫,這樣能省下不守重複步驟,但有時候要用真的會忘記,只能偷看一下小抄。

那今天先就先這樣。/images/emoticon/emoticon29.gif


上一篇
列表推導式
下一篇
Lambda 函式和高階函式
系列文
從Python入門到自製遊戲:30天鐵人挑戰之旅26
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言